#include "commonTool.h"
#include <termios.h>
#include <regex.h>
#include <stdio.h>
#include <string.h>

/* 枚举数据类型的空间占用 一定是4个字节 */
enum STATUS_CODE
{
    ON_SUCCESS,
    NULL_PRT,
    MALLOC_ERROR,
    INVALID_ACCESS,
    ILLEGALITY,
};

#define USERNMAE_MIN    3
#define USERNMAE_MAX    15
#define PASSWD_MIN      8
#define PASSWD_MAX      15

/* 静态函数前置声明 */
static int checkRegularLegal(const char *str, const char *pattern);


/* 合法返回0, 不合法返回状态码 */
static int checkRegularLegal(const char *str, const char *pattern)
{
    regex_t regex;
    memset(&regex, 0, sizeof(regex));


    /* 编译正则表达式 */
    int ret = regcomp(&regex, pattern, 0);
    if (ret)
    {
        printf("regcomp error");
        return ret;
    }

    /* 执行正则表达式 */
    ret = regexec(&regex, str, 0, NULL, 0);
    regfree(&regex);


    if (ret == 0)
    {
        return ILLEGALITY;
    }
    else if (ret == REG_NOMATCH)
    {
        /* 不存在非法字符 */
        return 0;
    }
    else
    {
        return ILLEGALITY;
    }
}  

/* 
    @brief      :校验用户名合法性
    @argumnet   :
    @return     : 合法返回true, 不合法返回false.    
*/
bool checkUserNameLegal(const char * name)
{
    if (name == NULL)
    {
        return false;
    }

    /* 长度 */
    int userNameLength = strlen(name);
    if (userNameLength < USERNMAE_MIN || userNameLength > USERNMAE_MAX)
    {
        return false;
    }

    /* 正则 */
    char * pattern = "[!@$]";
    int ret = checkRegularLegal(name, pattern);
    if (ret != 0)
    {
        return false;
    }

    return true;
}

/* 校验密码合法性 : passwd其实是明文 */
/* 
    @brief      :校验密码合法性
    @argumnet   :
    @return     : 合法返回true, 不合法返回false.    
*/
bool checkPasswdLegal(const char * passwd)
{
    if (passwd == NULL)
    {
        return false;
    }

    /* 长度 */
    int passwdLength = strlen(passwd);
    if (passwdLength < PASSWD_MIN || passwdLength > PASSWD_MAX)
    {
        return false;
    }

    /* 正则 */
    char * pattern = "[!@$]";
    int ret = checkRegularLegal(passwd, pattern);
    if (ret != 0)
    {
        return false;
    }

    return true;

    // /* 需要包含特殊字符 */
    // bool hasSpecialChar = false;
    // for (int idx = 0; idx < passwdLength; ++idx)
    // {
    //     if (!(passwd[idx] >= 'a' && passwd[idx] <= 'z') && !(passwd[idx] >= 'A' && passwd[idx] <= 'Z') && !(passwd[idx] >= '0' && passwd[idx] <= '9'))
    //     {
    //         /* 如果密码中包含除了字母和数字之外的字符，则认为包含了特殊字符 */ 
    //         hasSpecialChar = true;
    //         break;
    //     }
    // }
    
    // /* 如果密码不包含特殊字符，则认为密码不合法 */
    // if (!hasSpecialChar)
    // {
    //     return false; 
    // }

    // /* 其他情况下，认为密码合法 */
    // return true;  
}